const pathLib = require('path')
const resolve = require('resolve')
const fs = require('fs')
// 即是一个vite插件也是一个rollup插件
function resolvePlugin({ root }) {
  return {
    name: 'resolve',
    // path 有可能是绝对 是相对  别名
    resolveId(path, importer) {
      // 如果path 以/开头 是绝对路径，说明是根目录下的绝对路径  /src/main.js
      if (path.startsWith('/')) {
        return {
          id: pathLib.resolve(root, path.slice(1)),
        }
      }
      // 如果path是绝对路径 直接返回
      if (pathLib.isAbsolute(path)) {
        return {
          id: path,
        }
      }

      // 如果path是相对路径
      if (path.startsWith('.')) {
        const baseDir = pathLib.dirname(importer)
        const fsPath = pathLib.resolve(baseDir, path)
        return { id: fsPath }
      }

      // 如果是第三方
      let res = tryNodeResolve(path, importer, root)
      if (res) {
        return res
      }
    },
  }
}

function tryNodeResolve(path, importer, root) {
  // vue/package,json
  const pkgPath = resolve.sync(`${path}/package.json`, { basedir: root })
  // vue/package.json
  const pkgDir = pathLib.dirname(pkgPath)
  //
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))
  // vue/package.json module
  const entryPoint = pkg.module // module 字段值得是 esmodule格式引入的入口文件
  // vue/dist/vue.esm-bundler.js
  const entryPointPath = pathLib.join(pkgDir, entryPoint)
  return { id: entryPointPath }
}

module.exports = resolvePlugin
